package practice5;


import java.util.Scanner;

public class P8656 {

    static final int N=100001;

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        int[] cnt=new int[N];       //记录每个积分有多少个
        int[] a=new int[N];
        int[] dp=new int[N];        //dp[i]表示在同一个小组中前 i个分数中最多匹配不到的人数
        for(int i=1;i<=n;i++){
            int x=sc.nextInt();
            cnt[x]++;
        }
        int ans=0;
        if(k==0){
            //统计不同积分数即可
            for(int i=0;i<N;i++){
                if(cnt[i]>0){
                    ans++;
                }
            }
            System.out.println(ans);
        }else{
            //将积分分成K组,组内相差为k,只有同一组才能匹配到
            for(int i=0;i<k;i++){
                int index=0;
                //统计每组中各个积分的出现次数
                for(int j=i;j<N;j+=k){
                    a[index++]=cnt[j];
                }
                //进行动态规划
                dp[0]=a[0];
                for(int j=1;j<index;j++){
                    if(j==1){
                        dp[j]=Math.max(dp[0],a[1]);
                    }else{
                        dp[j]=Math.max(dp[j-1],dp[j-2]+a[j]);
                    }

                }
                ans+=dp[index-1];
            }
            System.out.println(ans);
        }
    }
}
